package com.cmwa.solution.sys.permission.dataRole.service.impl;

import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.type.Alias;
import org.springframework.stereotype.Service;

import com.cmwa.solution.base.entity.Employee;
import com.cmwa.solution.base.entity.Page;
import com.cmwa.solution.base.entity.SearchParam;
import com.cmwa.solution.exception.ValidateFailedException;
import com.cmwa.solution.sys.permission.authorityGroup.service.AuthorityGroupService;
import com.cmwa.solution.sys.permission.dataAuthority.entity.RoleVo;
import com.cmwa.solution.sys.permission.dataRole.dao.RoleDao;
import com.cmwa.solution.sys.permission.dataRole.service.RoleEmployeeRelationsService;
import com.cmwa.solution.sys.permission.dataRole.service.RoleService;
import com.cmwa.solution.utils.Constant;
import com.cmwa.solution.utils.SessionUtils;
import com.cmwa.solution.utils.cached.DictionaryCached;

@Service
@Alias("roleServiceImpl1")
public class RoleServiceImpl implements RoleService {
	
	@Resource
	private RoleDao roleDao;
	@Resource
	private RoleEmployeeRelationsService roleEmployeeRelationsService;
	@Resource
	private AuthorityGroupService authorityGroupService;
	/**
	 * 角色管理列表
	 * @author ex-weicb
	 * @createDate 2016年4月26日 下午6:35:36
	 * @param sp
	 * @return
	 */
	public Page<RoleVo> roleListPage(SearchParam param){
		//去空格
		String roleName = (String)param.getSp().get("roleName");
		if (roleName != null && roleName != "") {
			roleName = roleName.trim();
		}
		param.getSp().put("roleName", roleName);
		
		String postTitle = (String)param.getSp().get("postTitle");
		if (postTitle != null && postTitle != "") {
			postTitle = postTitle.trim();
		}
		param.getSp().put("postTitle", postTitle);
		
		String orgName = (String)param.getSp().get("orgName");
		if (orgName != null && orgName != "") {
			orgName = orgName.trim();
		}
		param.getSp().put("orgName", orgName);
		
		String operRoleName = (String)param.getSp().get("operRoleName");
		if (operRoleName != null && operRoleName != "") {
			operRoleName = operRoleName.trim();
		}
		param.getSp().put("operRoleName", operRoleName);
		//分页查询数据
		List<RoleVo> items =roleDao.roleListPage(param);
		return Page.create(items, param.getStart(), param.getLimit(), param.getTotal());
	}
	
	/**
	 * 根据角色id查找角色数据
	 * @author ex-weicb
	 * @createDate 2016年4月27日 下午2:01:52
	 * @param roleId
	 * @return
	 */
	public RoleVo queryByRoleId(String roleId){
		return roleDao.queryByRoleId(roleId);
	}

	/**
	 * 角色共享信息
	 */
	@Override
	public List<RoleVo> queryShareInfoById(String roleId) {
		return roleDao.queryShareInfoById(roleId);
	}
	
	/**
	 * 查找角色数量
	 * @author ex-weicb
	 * @createDate 2016年4月28日 下午1:51:41
	 * @param role
	 * @return
	 */
	@Override
	public int queryRoleCount(RoleVo role){
		return roleDao.queryRoleCount(role);
	}
	
	/**
	 * 新增角色
	 * @author ex-weicb
	 * @createDate 2016年4月28日 下午2:07:13
	 * @param role
	 * @return
	 * @throws ValidateFailedException 
	 */
	@Override
	public String saveRole(RoleVo role) throws ValidateFailedException{
		//1.根据角色名称和角色类型查询是否存在
		int count=roleDao.queryRoleCount(role);
		if (count>0) {
			throw new ValidateFailedException("角色名称:"+role.getRoleName()+",角色类型:"+DictionaryCached.getDictName(Constant.DCTTYPE_ROLE_XXX_TYPE, role.getRoleType())+"已存在，不能重复新增！");
		}
		//2.插入数据到角色表
		Employee employee =  SessionUtils.getEmployee();//当前的登录用户
		role.setCreateId(employee.getID());
		// 如果是账户管理角色类型，是否为部门资源默认角色 和 是否为部门人员默认角色 设默认值 = 否
		if (StringUtils.equals(Constant.CONSTANT_STRING_ONE, role.getRoleType())) {
			role.setIsDempt("N");
			role.setIsDemptPer("N");
		} else if (StringUtils.equals(Constant.CONSTANT_STRING_FIVE, role.getRoleType())) {
			// 如果是无资源角色类型，是否为部门资源默认角色 设默认值 = 否， 权限类型 = 特殊
			role.setIsDempt("N");
			role.setAuthorityType("2");
		}
		roleDao.insert(role);
		//3.插入数据到角色员工关系表
		String empIds=role.getEmpIds();
		if (!StringUtils.isEmpty(empIds)) {
			String[] empIdList=empIds.split(",");
			SearchParam param=new SearchParam();
			param.getSp().put("createId", employee.getID());
			param.getSp().put("roleId", role.getRoleId());
			param.getSp().put("empIds",empIdList);
			//批量新增员工关系列表
			roleEmployeeRelationsService.batchInsert(param);
		}
		//4.插入数据到角色分享表
		String shareRoleIds=role.getShareRoleIds();
		if (!StringUtils.isEmpty(shareRoleIds)) {
			String[] shareRoleIdList=shareRoleIds.split(",");
			SearchParam param=new SearchParam();
			param.getSp().put("roleId", role.getRoleId());
			param.getSp().put("shareRoleIds",shareRoleIdList);
			//批量新增角色分享表数据
			authorityGroupService.batchInsert(param);
		}
		return null;
	}
	
	/**
	 * 查找角色
	 * @author ex-weicb
	 * @createDate 2016年4月28日 下午4:56:33
	 * @param role
	 * @return
	 */
	@Override
	public List<RoleVo> queryRole(RoleVo role){
		return roleDao.queryRole(role);
	}
	
	/**
	 * 根据角色类型查找角色列表
	 * @author ex-weicb
	 * @createDate 2016年5月3日 上午9:12:51
	 * @param string
	 * @return
	 */
	public List<RoleVo> queryByType(String type){
		SearchParam param=new SearchParam();
		param.getSp().put("roleType", type);
		return roleDao.queryRoleByCondition(param);
	}
	
	/**
	 * 修改角色
	 * @author ex-weicb
	 * @createDate 2016年4月29日 上午9:30:40
	 * @param role
	 * @return
	 * @throws ValidateFailedException 
	 */
	public String updateRole(RoleVo role) throws ValidateFailedException{
		RoleVo roleSearch=roleDao.queryByRoleId(role.getRoleId());
		if(null==roleSearch){
			throw new ValidateFailedException( "数据不存在！");
		}
		//1.角色类型有修改的时候
		int shareCount=authorityGroupService.queryShareCountByRoleId(role.getRoleId());
		if (!roleSearch.getRoleType().equals(role.getRoleType())) {
			//1.1-角色有资源关联，不可以修改角色类型。
			int relationCount=0;
			if ("1".equals(roleSearch.getRoleType())) {
				relationCount=roleDao.queryRelationCountByTable(roleSearch.getRoleId());
			}
			if (relationCount>0) {
				throw new ValidateFailedException( "角色有资源关联，不可以修改角色类型。");
			}
			//1.2-角色有共享关联，不可修改角色类型。
			if (shareCount>0) {
				throw new ValidateFailedException( "角色有共享关联，不可修改角色类型。");
			}
		}
		//2.权限类型有修改的时候
		if (!roleSearch.getAuthorityType().equals(role.getAuthorityType())) {
			//2.1-角色有共享关联，不可修改权限类型。
			if (shareCount>0) {
				throw new ValidateFailedException( "角色有共享关联，不可修改权限类型。");
			}
		}
		if (StringUtils.equals(Constant.CONSTANT_STRING_TWO, role.getRoleType())) {
			// 如果是无资源角色类型，是否为部门资源默认角色 设默认值 = 否， 权限类型 = 特殊
			role.setIsDempt("N");
			role.setAuthorityType("2");
		}
		//3.修改角色表 
		Employee employee =  SessionUtils.getEmployee();//当前的登录用户
		role.setModifyId(employee.getID());
		roleDao.updateRole(role);
		//4.删除角色员工关系表并重新批量新增
		roleEmployeeRelationsService.deleteByRoleId(role.getRoleId());
		String empIds=role.getEmpIds();
		if (!StringUtils.isEmpty(empIds)) {
			String[] empIdList=empIds.split(",");
			SearchParam param=new SearchParam();
			param.getSp().put("createId", employee.getID());
			param.getSp().put("roleId", role.getRoleId());
			param.getSp().put("empIds",empIdList);
			//批量新增员工关系列表
			roleEmployeeRelationsService.batchInsert(param);
		}
		//5.删除旧的共享权限并重新批量新增
		authorityGroupService.deleteByRoleId(role.getRoleId());
		String shareRoleIds=role.getShareRoleIds();
		if (!StringUtils.isEmpty(shareRoleIds)) {
			String[] shareRoleIdList=shareRoleIds.split(",");
			SearchParam param=new SearchParam();
			param.getSp().put("roleId", role.getRoleId());
			param.getSp().put("shareRoleIds",shareRoleIdList);
			//批量新增角色分享表数据
			authorityGroupService.batchInsert(param);
		}
		
		//6.分享闭环校验
		String clShareNames=roleDao.getClShareNamesByRoleId(role.getRoleId());
		if (!StringUtils.isEmpty(clShareNames)) {
			throw new ValidateFailedException( "共享下列角色出现闭环："+clShareNames);
		}
		
		return null;
	}
}
